package com.wanghua.spring.listeners;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.http.*;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.Date;

/**
 * 监听 Session 内的对象。
 * 对应的接口是：HttpSessionBindingListener、HttpSessionActivationListener。
 * 与其他6种Listener不同的是，SessionObjectListener 类不需要在 web.xml 中声明。
 * 当 PersonInfo 类加入 session 时就会引发这个类里的监听事件 valueBound()
 *
 * 因为会被串行化，需要实现 Serializable。
 *
 * 测试时，将下面代码拷贝到 action：
     //PersonInfo 对象被放进、移出 session 或者启动、关闭服务器都会触发 SessionObjectListener 内的监听事件。
     HttpSession session =  ServletActionContext.getRequest().getSession();
     PersonInfo sol = (PersonInfo) session.getAttribute("staff_name");
     if(sol==null){
         sol =new PersonInfo();
         sol.setName("张三");
         session.setAttribute("staff_name", sol); //对象保存到 session
         session.removeAttribute("staff_name");   //对象移除
         System.out.println("对象不存在，已经成功新建。sessionId："+session.getId());
     }else{
        System.out.println("对象存在，无须新建。sessionId："+session.getId());
     }
 */
public class PersonInfo implements HttpSessionBindingListener,HttpSessionActivationListener ,Serializable {
    private static final long serialVersionUID = -4780592776386225973L;
    Log log = LogFactory.getLog(getClass());
    private String name;
    private Date dateCreated;

    //被放进 session 前被执行
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        HttpSession session = event.getSession();  //所在的 session
        log.info(MessageFormat.format("{0} 被绑定到 session \"{1}\" 的 {2} 属性上。", this, session.getId(), event.getName()));
    }

    //从 session 中移除后被调用
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        HttpSession session = event.getSession();  //所在的 session
        log.info(MessageFormat.format("{0} 被从 session \"{1}\" 的 {2} 属性上移除。", this, session.getId(), event.getName()));
    }


    //即将被钝化(内容保存到硬盘)到硬盘时被调用
    @Override
    public void sessionWillPassivate(HttpSessionEvent event) {
        HttpSession session = event.getSession();  //所在的 session
        log.info(MessageFormat.format("{0} 即将保存到硬盘。 sessionId：{1}。", this, session.getId()));
    }

    //从硬盘恢复后被调用
    @Override
    public void sessionDidActivate(HttpSessionEvent event) {
        HttpSession session = event.getSession();  //所在的 session
        log.info(MessageFormat.format("{0} 已经成功从硬盘中加载。 sessionId：{1}。", this, session.getId()));
    }


    @Override
    public String toString() {
        return MessageFormat.format("SessionObjectListener({0})", name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }
}
